package database

import (
	"fmt"

	"github.com/lexkong/log"
	"github.com/spf13/viper"

	// MySQl driver
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// DBConfig is database connection config infomation structure
type DBConfig struct {
	UserName string
	Password string
	Address  string
	DBName   string
}

// dbCfg is database connection config infomation
var dbCfg *DBConfig

// DB is a database connection
var DB *gorm.DB

// InitDBConfig function
// Initail database connection config infomation
func InitDBConfig(dbConfig *DBConfig) {
	dbCfg = dbConfig
}

// OpenDB function
// Open database
func OpenDB() error {
	conStr := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=%t&loc=%s",
		dbCfg.UserName,
		dbCfg.Password,
		dbCfg.Address,
		dbCfg.DBName,
		true,
		//"Asia/Shanghai"),
		"Local")

	var err error
	DB, err = gorm.Open("mysql", conStr)
	if err != nil {
		return err
	}

	// set for db connection
	setupDB(DB)

	return nil
}

func setupDB(db *gorm.DB) {
	db.LogMode(viper.GetBool("gormlog"))
	//db.DB().SetMaxOpenConns(20000) // 用于设置最大打开的连接数，默认值为0表示不限制.设置最大的连接数，可以避免并发太高导致连接mysql出现too many connections的错误。
	db.DB().SetMaxIdleConns(0) // 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
}

// CloseDB function
// close database
func CloseDB() {
	if err := DB.Close(); err != nil {
		log.Error("Close Database Fail.", err)
	}
}
